import { nanoid } from 'nanoid'
/**
 * @Author HuiLY
 * @Date 2023-03-08 16:15:17
 * @constructor
 * @ 提供通用属性 
 * @ 属性设置getter和setter 用于自动更新updateColums
 */
class BaseModel extends Object {
    /** 
     * @param {BaseModel} model
     * @param {boolean} noid 没有单id，默认fales
     */
    constructor(model = null, noid = false) {
        super()
        this.id = noid ? null : (model.id ? model.id : nanoid(16))
        this._UpdateColumns = new Map()
    }
    get UpdateColumns() {
        return this._UpdateColumns;
    }
    /**
     * @param {Map} values
     */
    set UpdateColumns(values) {
        for (const { key, value } of values) {
            if (key in this) {
                this._UpdateColumns.set(key, value)
            }
        }
    }

    /** 
     * @param {String} column 
     * @param {String} value
     */
    AddUpdateColumns(column, value) {
        this.UpdateColumns.set(column, value);
        return this.UpdateColumns;
    }

    /** 
     * @param {String} column
     */
    RemoveUpdateColumns(column) {
        this.UpdateColumns.delete(column);
        return this.UpdateColumns;
    }

    /** 
     * @param {Boolean} all true：清除全部要更新的列
     */
    ClearUpdateColumns(all = false) {
        if (all) {
            this.UpdateColumns.clear();
        }
        return this.UpdateColumns;
    }

    /**
     * @returns {Map}
     */
    GetUpdateColumns() {
        return this.UpdateColumns;
    }

    /**
     * 统一设置更新列
     * @param {Object} columns
     * @returns {Map}
     */
    SetUpdateColumns(columns) {
        this._UpdateColumns.clear()
        for (const key in columns) {
            if (Object.hasOwnProperty.call(columns, key)) {
                const element = columns[key];
                this._UpdateColumns.set(key, element)
            }
        }
        return this._UpdateColumns
    }

    /**
     * @param {Boolean} noid 不是ID作为主键
     * @returns {{keys:Array,values:Array}}
     */
    GetKeys_Values(noid = true) {
        let keys = []
        let values = []
        for (const key in this) {
            if (Object.hasOwnProperty.call(this, key)) {
                if (this[key] !== null && this[key] !== undefined && key != '_UpdateColumns') {
                    keys.push(key)
                    values.push(this[key])
                }
            }
        }
        return { keys, values }
    }
    /**
     * @type {string}
     */
    static Instance = '';
    /**
     * 对于Boolean值进行判断 用 0、1代替
     * @param {string | number} value
     * @returns {number} 0、1
     */
    static CheackBoolean(value) {
        if (typeof (value) === 'number' || typeof (value) === 'string') {
            value = parseInt(value)
            if (value <= 0) return 0
            return 1
        }
        if (typeof (value) === 'boolean') {
            return value
        }
        return 0
    }
    /**
     * @param {string} value 字段值
     * @param {string} fieldname 用户字段名报错
     * @returns {value}
     */
    static CheackNull(value, fieldname) {
        if (value === null || value === undefined) {
            throw TypeError(fieldname + '不能为空')
        } else return value
    }
}
export default BaseModel;